package com.study.spaoplog.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

/**
 * @author MI
 * @version 1.0
 * @date 2021/6/8 21:34
 */
@Slf4j
// @Configuration
public class ZookClientConfig {

    @Autowired
    private Environment env;

    /**
     * 正常退出会自动关闭|
     * <p>
     * o.a.curator.framework.imps.CuratorFrameworkImpl-[964] backgroundOperationsLoop exiting
     * </p>
     * 自定义注入Bean-ZooKeeper高度封装过的客户端Curator实例
     */
    @Bean(name = {"zkClient", "curatorFramework"})
    public CuratorFramework curatorFramework() {
        //创建CuratorFramework实例
        //（1）创建的方式是采用工厂模式进行创建；
        //（2）指定了客户端连接到ZooKeeper服务端的策略：这里是采用重试的机制(5次，每次间隔1s)
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .sessionTimeoutMs(1000)    // 连接超时时间
                .connectionTimeoutMs(1000) // 会话超时时间
                .connectString(env.getProperty("zk.host"))
                .namespace(env.getProperty("zk.namespace"))
                // 重试
                .retryPolicy(new RetryNTimes(5, 1000)).build();
        curatorFramework.start();
        //返回CuratorFramework实例
        return curatorFramework;
    }

}
